//package com.ruoyi.eqmonitor.utils;
//
//import cn.hutool.core.util.ArrayUtil;
//import cn.hutool.core.util.StrUtil;
//import cn.hutool.json.JSONObject;
//import cn.hutool.json.JSONUtil;
//import com.ruoyi.common.core.exception.ServiceException;
//import com.vividsolutions.jts.geom.Geometry;
//import com.vividsolutions.jts.io.ParseException;
//import com.vividsolutions.jts.io.WKTReader;
//import lombok.extern.slf4j.Slf4j;
//import org.geotools.geojson.geom.GeometryJSON;
//
//import java.io.IOException;
//import java.io.StringReader;
//import java.io.StringWriter;
//import java.util.Locale;
//
//import lombok.extern.slf4j.Slf4j;
//
///**
// * 几何类型转换工具
// */
//@Slf4j
//public class GeometryConvertUtil {
//
//    private static final WKTReader READER = new WKTReader();
//
//    /**
//     * 地理数据类型
//     * 点、线、面、几何集合
//     */
//    private static final String[] GEO_TYPE = new String[]{ "geometry", "point", "linestring", "polygon", "multipoint", "multilinestring", "multipolygon", "geometrycollection"};
//
//    /**
//     * WKT 转 Geometry
//     * @param wktStr WKT 字符串
//     * @return Geometry对象
//     */
//    public static Geometry wkt2Geometry(String wktStr) {
//        if (!isWkt(wktStr)) throw new ServiceException("illegality WKT => " + wktStr);
//        try {
//            return READER.read(wktStr);
//        } catch (ParseException e) {
//            log.error("Wkt2Geometry失败, 参数: {}, 异常: {}", wktStr, e);
//            throw new ServiceException("Wkt2Geometry FAIL => " + wktStr + e.getMessage());
//        }
//    }
//
//    /**
//     * GeoJson 转 Geometry
//     * @param geoJson GeoJson 字符串
//     * @return Geometry对象
//     */
//    public static Geometry geoJson2Geometry(String geoJson) {
//        // 格式不正确则直接抛异常
//        if (!isGeoJson(geoJson)) throw new ServiceException("illegality GeoJson => " + geoJson);
//        // 尝试转换
//        try {
//            GeometryJSON geometryJson = new GeometryJSON(6);
//            return geometryJson.read(new StringReader(geoJson));
//        } catch (IOException e) {
//            log.error("GeoJson2Geometry失败, 参数: {}, 异常: {}", geoJson, e);
//            throw new ServiceException("GeoJson2Geometry FAIL => " + geoJson + e.getMessage());
//        }
//    }
//
//    /**
//     *  GeoJson 转 WKT
//     * @param geoJson GeoJson 字符串
//     * @return WKT 字符串
//     */
//    public static String geoJson2Wkt(String geoJson) {
//        String wkt;
//        if (!isGeoJson(geoJson)) return null;
//        try {
//            Geometry geometry = geoJson2Geometry(geoJson);
//            wkt = geometry.toText();
//        } catch (Exception e){
//            log.error("GeoJson 转 WKT 出现异常：" + e);
//            throw e;
//        }
//        return wkt;
//    }
//
//    /**
//     * WKT 转 GeoJson
//     * @param wktStr WKT 字符串
//     * @return GeoJson 字符串
//     */
//    public static String wkt2GeoJson(String wktStr) {
//        String geoJson;
//        if (!isWkt(wktStr)) return null;
//        try {
//            Geometry geometry = READER.read(wktStr);
//            StringWriter writer = new StringWriter();
//            GeometryJSON geometryJson = new GeometryJSON();
//            geometryJson.write(geometry, writer);
//            geoJson = writer.toString();
//        } catch (Exception e) {
//            log.error("WKT 转 GeoJson 出现异常："+ e);
//            throw new ServiceException(e.getMessage());
//        }
//        return geoJson;
//    }
//
//    /**
//     * 是规范的 WKT
//     * @param wktStr WKT 字符串
//     * @return 是、否
//     */
//    public static boolean isWkt(String wktStr) {
//        if (StrUtil.isEmpty(wktStr)) return false;
//        return StrUtil.startWithAny(wktStr.toLowerCase(Locale.ROOT), GEO_TYPE);
//    }
//
//    /**
//     * 是规范的 GeoJson
//     * @param geoJson GeoJson 对象
//     * @return 是、否
//     */
//    public static boolean isGeoJson(String geoJson) {
//        if (StrUtil.isBlank(geoJson) || !JSONUtil.isJson(geoJson)) return false;
//        JSONObject jsonObject = JSONUtil.parseObj(geoJson);
//        String type = jsonObject.getStr("type");
//        return existGeoType(type);
//    }
//
//    /**
//     * 类型是否是 Geo 类型
//     * @param geoStr Geo 字符串
//     * @return 是、否
//     */
//    public static boolean existGeoType(String geoStr) {
//        return ArrayUtil.containsIgnoreCase(GEO_TYPE, geoStr);
//    }
//
//}
